define(["jquery","template","comm/form/form.config","comm/form/form.servers","comm/form/form.tpl"],
	function($,template,$config,$servers,$tpl){
	var form = {};

	/**
	 * 初始化UI
	 */
	var initUi = function(options){
		var data = $servers.handleQuestionData(options);
		$("#"+options.id).html( $tpl.init() );
		var html = template("tpl_form_total",data);
		$("#"+options.id).html(html);
	}

	/**
	 * 事件
	 */
	var initEvent = function(params,id){
		var questTypeArr = $config.getAllQuestType(); // 题型多了之后，questTypeArr可以从配置的问卷里获取
		for (var i=0; i < questTypeArr.length; i++) {
			var $quest = $config.getQuest(questTypeArr[i]);
			if( $quest.event && typeof $quest.event == "function" ) $quest.event(params,id);
		}
	}

	/**
	 * 提醒
	 */
	var initAttention = function(id){
		var questTypeArr = $config.getAllQuestType(); // 题型多了之后，questTypeArr可以从配置的问卷里获取
		for (var i=0; i < questTypeArr.length; i++) {
			var $quest = $config.getQuest(questTypeArr[i]);
			if( $quest.attention && typeof $quest.attention == "function" ) $quest.attention(id);
		}
	}

	/**
	 * 校验
	 * flag:
	 * 	 true: form.validate()里调用 (点击保存按钮时使用)
	 * 	 false: form.init()里调用
	 */
	var initValidate = function(id,flag){
		var questTypeArr = $config.getAllQuestType(); // 题型多了之后，questTypeArr可以从配置的问卷里获取
		var result = true;
		for (var i=0; i < questTypeArr.length; i++) {
			var $quest = $config.getQuest(questTypeArr[i]);
			if( $quest.validate && typeof $quest.validate == "function" ){
				if( !flag ){
					$quest.validate(id,flag);
				}else{
					result = result && $quest.validate(id,flag);
					if( !result ) return result;
				}
			} 
		}
		return result;
	}

	/**
	 * 将默认值和答案融合
	 */
	var mixValues = function(questions,values){
		var defaultVals = $servers.getQuestsHasDefaultVal(questions);
		if( !values ) values = [];
		for (var i = 0; i < defaultVals.length; i++) {
			var flag = false;
			for (var j = 0; j < values.length; j++) {
				if( defaultVals[i].deCode == values[j].deCode ){
					flag = true;
					break;
				}
			}
			if( !flag ) {
				defaultVals[i].quesValue = defaultVals[i].val;
				values.push(defaultVals[i]);
			}
		}
		// “.”不能作为name的名称
		for (var i = 0; i < values.length; i++) {
			if(values[i].deCode) values[i].name = values[i].deCode.replace(/\./g, "_");
		}
		return values;
	}

	/**
	 * 赋值
	 */
	var initValues = function(values,id){
		for (var i = 0; i < values.length; i++) {
			var $dom = $("#" + id + " .qaCard").find("[name="+ values[i].name +"]");
			if( $dom.length > 0 ){
				var type = $dom.attr("data-type");
				var $quest = $config.getQuest(type);
				if( $quest.setValue && typeof $quest.setValue == "function" ){
					if( type == "question_staticAge" || type == "question_staticGestationalAge" ){ // 特殊题型，特殊处理(需要Pub1100004、Pub1100005、Pub1100006)
						$quest.setValue($dom,values);
					}else{
						$quest.setValue($dom,values[i]);
					}
				}
			}
		}
	}

	/**
	 * 初始化
	 * id：			dom元素的id
	 * status：		状态 default(默认)、readonly、disabled(全部题目应用)
	 * questions：	问卷
	 * setStatus：	设置状态(为每一个题目设置与整体题目不同的状态，根据deCode来设置)
	 * 	eg:[
	 * 		{"deCode":"DE06.00.159.00.02","status":"readonly"},
	 * 		{"deCode":"DE08.10.013.00.10","status":"readonly"},
	 * 	]
	 * values：     问卷答案
	 * event：      事件参数
	 */
	form.init = function(options){
		initUi(options); // 需要用到id、status、questions、setStatus
		initEvent(options.event,options.id);
		initAttention(options.id);
		initValidate(options.id);
		var values = mixValues(options.questions,options.values);
		if( values ) initValues(values,options.id);
	}

	/**
	 * 获取答案时，判断答案是否已经获取
	 */
	var isHasValue = function(valueList,deCode){
		for (var i = 0; i < valueList.length; i++) {
			if( valueList[i].deCode == deCode ){
				return true;
			}
		}
		return false;
	}

	/**
	 * 获取需要保存的问卷答案
	 * 	domId:包裹form表单的dom元素的id
	 */
	form.getSaveData = function(domId){
		var $tmp = $("#" + domId).children("form").children("div.form-tmp");
		var contList = [];
		$tmp.each(function(){
			var tmplType = $(this).attr("data-tmplType");
			var templVersionId = $(this).attr("data-templVersionId");
			// contId:任务内容id(建档用); ptContId:任务内容实例id(任务用)
			var contId = $(this).attr("data-contId");
			var ptContId = $(this).attr("data-ptContId");
			var valueList = [];
			var $dom = $(this).find("*[name]");
			if( $dom.length > 0 ){
				$dom.each(function(i){
					var type = $(this).attr("data-type");
					var deCode = $(this).attr("data-deCode");
					var name = $(this).attr("name");
					var $quest = $config.getQuest(type);
					if( $quest.getValue && typeof $quest.getValue == "function" ) {
						if( !isHasValue(valueList,deCode) ){
							var value = $quest.getValue($(this),name);
							valueList.push(value);
						}
					}
				});
			}
			var obj = {
				"tmplType":tmplType,
				"templVersionId":templVersionId,
				"valueList":valueList,
			};
			contId ? $.extend(obj,{"contId":contId}) : $.extend(obj,{"ptContId":ptContId});
			contList.push(obj);
		});
		return contList;
	}

	/**
	 * 点击保存按钮，调用该接口
	 * @return {boolean}
	 */
	form.validate = function(domId){
		return initValidate(domId,true);
	}

	return form;
});